using Mbl.ParameterizedTest.FluentCollectionBuilding.Expectors;
using System.Collections.Generic;

namespace Mbl.ParameterizedTest.FluentCollectionBuilding.RowCollectors
{
    /// <summary>
    /// Test row collector for collection outputs with 1 input arguments
    /// </summary>
    public class EnumerableTestRowCollector<TIn1, TElement> : TestRowCollector<TIn1, IEnumerable<TElement>>	
    {        
        public EnumerableTestRowCollector(TestCollection<TIn1, IEnumerable<TElement>> testCollection)
            : base(testCollection)
        {            
        }

        public EnumerableExpector<TIn1, TElement, EnumerableTestRowCollector<TIn1, TElement>> Given(TIn1 in1)
        {            
            return new EnumerableExpector<TIn1, TElement, EnumerableTestRowCollector<TIn1, TElement>>(this, CreateTestCase(in1));
        }        
    }    

    /// <summary>
    /// Test row collector for collection outputs with 2 input arguments
    /// </summary>
    public class EnumerableTestRowCollector<TIn1, TIn2, TElement> : TestRowCollector<TIn1, TIn2, IEnumerable<TElement>>	
    {        
        public EnumerableTestRowCollector(TestCollection<TIn1, TIn2, IEnumerable<TElement>> testCollection)
            : base(testCollection)
        {            
        }

        public EnumerableExpector<TIn1, TIn2, TElement, EnumerableTestRowCollector<TIn1, TIn2, TElement>> Given(TIn1 in1, TIn2 in2)
        {            
            return new EnumerableExpector<TIn1, TIn2, TElement, EnumerableTestRowCollector<TIn1, TIn2, TElement>>(this, CreateTestCase(in1, in2));
        }        
    }    

    /// <summary>
    /// Test row collector for collection outputs with 3 input arguments
    /// </summary>
    public class EnumerableTestRowCollector<TIn1, TIn2, TIn3, TElement> : TestRowCollector<TIn1, TIn2, TIn3, IEnumerable<TElement>>	
    {        
        public EnumerableTestRowCollector(TestCollection<TIn1, TIn2, TIn3, IEnumerable<TElement>> testCollection)
            : base(testCollection)
        {            
        }

        public EnumerableExpector<TIn1, TIn2, TIn3, TElement, EnumerableTestRowCollector<TIn1, TIn2, TIn3, TElement>> Given(TIn1 in1, TIn2 in2, TIn3 in3)
        {            
            return new EnumerableExpector<TIn1, TIn2, TIn3, TElement, EnumerableTestRowCollector<TIn1, TIn2, TIn3, TElement>>(this, CreateTestCase(in1, in2, in3));
        }        
    }    

    /// <summary>
    /// Test row collector for collection outputs with 4 input arguments
    /// </summary>
    public class EnumerableTestRowCollector<TIn1, TIn2, TIn3, TIn4, TElement> : TestRowCollector<TIn1, TIn2, TIn3, TIn4, IEnumerable<TElement>>	
    {        
        public EnumerableTestRowCollector(TestCollection<TIn1, TIn2, TIn3, TIn4, IEnumerable<TElement>> testCollection)
            : base(testCollection)
        {            
        }

        public EnumerableExpector<TIn1, TIn2, TIn3, TIn4, TElement, EnumerableTestRowCollector<TIn1, TIn2, TIn3, TIn4, TElement>> Given(TIn1 in1, TIn2 in2, TIn3 in3, TIn4 in4)
        {            
            return new EnumerableExpector<TIn1, TIn2, TIn3, TIn4, TElement, EnumerableTestRowCollector<TIn1, TIn2, TIn3, TIn4, TElement>>(this, CreateTestCase(in1, in2, in3, in4));
        }        
    }    

    /// <summary>
    /// Test row collector for collection outputs with 5 input arguments
    /// </summary>
    public class EnumerableTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TElement> : TestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, IEnumerable<TElement>>	
    {        
        public EnumerableTestRowCollector(TestCollection<TIn1, TIn2, TIn3, TIn4, TIn5, IEnumerable<TElement>> testCollection)
            : base(testCollection)
        {            
        }

        public EnumerableExpector<TIn1, TIn2, TIn3, TIn4, TIn5, TElement, EnumerableTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TElement>> Given(TIn1 in1, TIn2 in2, TIn3 in3, TIn4 in4, TIn5 in5)
        {            
            return new EnumerableExpector<TIn1, TIn2, TIn3, TIn4, TIn5, TElement, EnumerableTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TElement>>(this, CreateTestCase(in1, in2, in3, in4, in5));
        }        
    }    

    /// <summary>
    /// Test row collector for collection outputs with 6 input arguments
    /// </summary>
    public class EnumerableTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TElement> : TestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, IEnumerable<TElement>>	
    {        
        public EnumerableTestRowCollector(TestCollection<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, IEnumerable<TElement>> testCollection)
            : base(testCollection)
        {            
        }

        public EnumerableExpector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TElement, EnumerableTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TElement>> Given(TIn1 in1, TIn2 in2, TIn3 in3, TIn4 in4, TIn5 in5, TIn6 in6)
        {            
            return new EnumerableExpector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TElement, EnumerableTestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TElement>>(this, CreateTestCase(in1, in2, in3, in4, in5, in6));
        }        
    }    

}